package tcp

type SessionContext struct {
	*Session
	*node
}

func (ctx *SessionContext) SetCurrentNode(node *node) {
	ctx.node = node
}

func (ctx *SessionContext) CurrentNode() *node {
	return ctx.node
}

func (ctx *SessionContext) PreWrite(buf *Buffer) {
	if handler := ctx.PreHandler(); handler != nil {
		ctx.goPre()
		handler.Write(ctx, buf)
	}
}

func (ctx *SessionContext) NextOnMessage(buf *Buffer) {
	if handler := ctx.NextHandler(); handler != nil {
		ctx.goNext()
		handler.OnMessage(ctx, buf)
	}
}

func (ctx *SessionContext) NextHandler() MessageHandler {
	if ctx.node.Next != nil {
		return ctx.node.Next.MessageHandler
	}
	return nil
}

func (ctx *SessionContext) PreHandler() MessageHandler {
	if ctx.node.Pre != nil {
		return ctx.node.Pre.MessageHandler
	}
	return nil
}

func (ctx *SessionContext) goNext() bool {
	if ctx.node.Next != nil {
		ctx.node = ctx.node.Next
		return true
	}
	return false
}

func (ctx *SessionContext) goPre() bool {
	if ctx.node.Pre != nil {
		ctx.node = ctx.node.Pre
		return true
	}
	return false
}
